const {app, BrowserWindow, clipboard, ipcMain, globalShortcut,TouchBar, Menu} = require('electron');
const path = require('path')
const constValue = require('./ConstValue.js');
const fs = require('fs');
const touchBar = require('./touchbar');



/*
app的基础配置
 */
// 用途:设置应用在 dock 中显示的字符串
//mac系统下关闭dock栏
if(process.platform === 'darwin'){
    app.dock.setBadge("剪贴板");
}
//Windows系统下的一些配置
if (process.platform === "win32") {
    //关闭菜单栏
    Menu.setApplicationMenu(null) // null值取消顶部菜单栏
}

//设置开机启动项,启动时隐藏
app.setLoginItemSettings({
    openAtLogin: true,
    openAsHidden:true
})



/*
一些控制的全局变量
 */
//是否加载完成,防止还没有读取缓存文件就将文件覆盖了
let loaded = false;


/*
常量
 */
//缓存目录
const CACHE_DIR = path.join( path.dirname(app.getPath('userData')),"yuanao","ClipBoard");
//程序执行目录
const EXE_DIR = path.dirname(app.getPath('exe'));

//缓存文件的位置
const CACHE_FILE_PATH = path.join(CACHE_DIR, "cache.json");

/*
开始渲染窗口
 */

let win
const createWindow = () => {
    win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            // preload: path.join(__dirname, "main.js"),
            nodeIntegration: true,
            contextIsolation: false
        }
    });

    win.loadFile('main.html');
    win.setTouchBar(touchBar);
}
let arr = [];

/**
 * 压栈处理,还要对数据进行处理
 * @param text 需要压栈的文本
 * @returns {number}
 */
function unshift(text) {
    let returnObj = arr.unshift(text);

    //写入本地
    if (loaded) {
        fs.writeFile(CACHE_FILE_PATH, JSON.stringify(arr), (err) => {
            if (err) {
                console.error(err)
            }
        })
    }

    return returnObj;
}

let interval = setInterval(() => {
    //关于文本类型的判断
    let text = clipboard.readText();
    if (text !== '' && text !== undefined && text != null) {
        if (arr.length === 0) {
            //数组长度为0,直接压栈
            unshift(text);
        } else {
            //数组长度不为0,判断当前值是否和最上面一个一致
            if (arr[0] !== text) {
                unshift(text);
            }
        }
    }

}, constValue.REFRESH_DELAY)


//当窗口准备好的时候
app.whenReady().then(() => {
    createWindow()

    globalShortcut.register('Alt+D', (e) => {
        if (win.isFocused()) {
            hideWin();
        } else {
            showWin();
        }
    });
    // globalShortcut.register('CommandOrControl+I', showWin);

    //将本地缓存加载进来
    loadCache();

    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) {
            createWindow()
        }
    })

    //加载完成
    loaded = true;
})





//适配关闭
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit()
    }
})


/**
    自定义方法区
 */

/**
 * 隐藏当前窗口
 */
function hideWin() {
    //mac系统下关闭dock栏
    if(process.platform === 'darwin'){
        app.dock.hide();
    }
    win.hide();
    console.log("窗口隐藏")
}

/**
 * 取消隐藏当前窗口
 */
function showWin() {
    //mac系统下显示dock栏
    if(process.platform === 'darwin'){
        app.dock.show();
    }
    win.show();
    win.focus();
    console.log("窗口显示")
}

/**
 * 第一次启动时读取本地缓存
 */
function loadCache() {
    //先创建文件夹,方式文件夹不存在
    fs.mkdirSync(CACHE_DIR,{
        recursive: true
    });
    //文件不存在创建文件
    if (!fs.existsSync(CACHE_FILE_PATH)) {
        fs.writeFileSync(CACHE_FILE_PATH,"[]");
    } else {
        //有文件存在,读取缓存文件
        let json = fs.readFileSync(CACHE_FILE_PATH);
        arr = JSON.parse(json);
    }
}




/*
接受子组件的事件
 */

//接受别的线程的剪切板请求
ipcMain.handle(constValue.CLIP_BOARD_KEY_FOR_IPC, (event, someArgument) => {
    return JSON.stringify(arr);
})
//事件 清空剪切板
ipcMain.handle(constValue.EVENT_CLEAR_CLIP_BOARD_IPC, (event, params) => {
    //清空挡墙剪切板
    clipboard.clear();
    //清空数组
    arr = [];
    //清空本地缓存
    fs.writeFile(CACHE_FILE_PATH, "", (err) => {
        if (err) {
            console.error("写入本地失败",err)
            return 'err:' + err
        }
    })
    return 'success';
})

// 点击某一条并复制
ipcMain.handle(constValue.EVENT_COPY_ONE_IPC, (event, params) => {
    //复制内容到剪切板
    clipboard.writeText(arr[params]);
    //关闭窗口
    hideWin();
})

